/**
 * $Author: francesco.benincasa $
 * $Date: 2007-02-16 14:50:42 +0100 (ven, 16 feb 2007) $
 * $Rev: 472 $
 */
package org.stars.database.connectionpool;

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameNotFoundException;
import javax.sql.DataSource;

import org.apache.commons.logging.Log;
import org.stars.database.ConnectionPool;

/**
 * Wrapper per il connection pool le cui connessioni vengono prese da jndi. Un
 * esempio della stringa da passare al costruttore di questo wrapper:
 * <code><pre>
 * java:/comp/env/jdbc/websecurity
 * </pre></code>
 * 
 * 
 * @author Francesco Benincasa (908099)
 * 
 */
public class JNDIConnectionPool extends ConnectionPoolBase implements ConnectionPool {

	/**
	 * Costruttore del connection pool. Il nome viene messo in uppercase. Per
	 * vedere che la risorsa sia accessibile, nel costruttore viene cercata di
	 * aprire una connessione. In caso di errore viene segnalata la cosa su log.
	 * 
	 * @param sName
	 *            nome del connection pool.
	 * @param sJNDIResource
	 */
	public JNDIConnectionPool(String sName, String sJNDIResource) {
		super();
		Log log = getLogger();
		Connection conn = null;
		try {
			jndiResource = sJNDIResource;
			name = sName.toUpperCase();

			log.info("Created connection pool (JNDI) " + sName);
			setInfo("Jndi resource:" + sJNDIResource);
		} catch (Exception e) {
			log.fatal("It is impossibile to create connection pool JNDI " + sName + ": " + e.toString());
		} finally {
			if (conn != null) {
				try {
					conn.close();
				} catch (Exception e) {
				}
			}
		}
	}

	/**
	 * nome del connection pool
	 */
	private String name;

	/**
	 * nome della risorsa jndi
	 */
	private String jndiResource;

	/**
	 * Getter dell'attributo jndiResource.
	 * 
	 * @return the jndiResource
	 */
	public String getJndiResource() {
		return jndiResource;
	}

	/**
	 * Setter dell'attributo jndiResource.
	 * 
	 * @param jndiResource
	 *            the jndiResource to set
	 */
	public void setJndiResource(String jndiResource) {
		this.jndiResource = jndiResource;
	}

	/**
	 * @see it.insiel.database.ConnectionPool#getConnection()
	 */
	@Override
	public Connection getConnection() throws SQLException {
		Context initContext = null;
		DataSource ds;
		Connection conn = null;
		Log log = getLogger();
		try {
			initContext = new InitialContext();
			ds = (DataSource) initContext.lookup(jndiResource);
			conn = ds.getConnection();
		} catch (NameNotFoundException e) {
			conn = null;
		} catch (SQLException e) {
			// come gli altri cp, in caso di errore sql lo mandiamo avanti
			throw (e);
		} catch (Exception e) {
			conn = null;
			log.error(e.toString());
		} finally {
			try {
				initContext.close();
			} catch (Exception e) {
				log.error(e.toString());
			}
		}
		return getConnection(conn);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see it.insiel.database.ConnectionPool#getName()
	 */
	@Override
	public String getName() {
		return name;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see it.insiel.database.ConnectionPool#setName(java.lang.String)
	 */
	@Override
	public void setName(String value) {
		name = value;
	}

}
